
package Modelo;


import Controlador.*;
import Vista.Pantalla;



import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

//import java.io.Serializable;

import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;


import javax.swing.JOptionPane;


import java.awt.Canvas;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;


import java.util.TreeMap;


public class Escenario extends Canvas implements WindowListener{
    

    private static final long serialVersionUID = 1L;

    private String mensaje;
    public JFrame jframe;
    public Vector figura = new Vector();

    Pared pared1, pared2, pared3, pared4, pared5, pared6, pared7,pared8,pared9,pared10;
    public Autito auto1,auto2;
    Base base;
    Destino destino;
    Policia policia1,policia2,policia3;
    Semaforo semaforo1,semaforo2,semaforo3,semaforo4,semaforo5,semaforo6,semaforo7,semaforo8;

    public PeritoColision perito;    //SOLO SERVER  !!!
    Arbitro arbitro;                 //SOLO SERVER  !!!

    TreeMap<Integer, Integer> tcServidor;
    TreeMap<Integer, Integer> tcCliente;


    Pantalla pantalla;   //refresco pantalla

    int i, j;
    Boolean b;
    transient Image imgBuff;
    transient Graphics grafBuff;
    public JLabel jlabel1, jlabel2;

    public Escenario() {
    }

    public Escenario(String mensaje) {

        setMensaje(mensaje);
        jframe = new JFrame(mensaje);
        
         jframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        
        jframe.addWindowListener(this);

        //TODO: poner en falso cuando lo mandamos por socket
        jframe.setVisible(true);

        jframe.setLayout(null);
        jframe.setBounds(20, 20, 800, 600);
        jframe.setBackground(Color.gray);
        setBounds(40, 40, 800, 600);
        setBackground(Color.gray);
        jframe.getContentPane().add(this);


        pared1 = new Pared(1, 0, 0, 600, 10, Color.green, 1000, true);
        this.getFigura().add(pared1);
        pared2=new Pared(2, 0,0,10,800,Color.green,1000,true);
        this.getFigura().add(pared2);
        pared3=new Pared(3, 0,590,10,800,Color.green,1000,true);
        this.getFigura().add(pared3);
        pared4=new Pared(4, 790,0,600,10,Color.green,1000,true);
        this.getFigura().add(pared4);

        pared5=new Pared(5, 440,105,90,190,Color.yellow,1000,true);
        this.getFigura().add(pared5);
        pared6=new Pared(6, 140,415,90,190,Color.yellow,1000,true);
        this.getFigura().add(pared6);
        pared7=new Pared(7, 140,105,90,190,Color.yellow,1000,true);
        this.getFigura().add(pared7);
        pared8=new Pared(8, 440,415,90,190,Color.yellow,1000,true);
        this.getFigura().add(pared8);
        pared9=new Pared(9, 140,250,90,190,Color.yellow,1000,true);
        this.getFigura().add(pared9);
        pared10=new Pared(10, 440,250,90,190,Color.yellow,1000,true);
        this.getFigura().add(pared10);



        //Los treeMap deberian ser alguna funcion. El cliente que habilite la del
        //autito 2, el server autito 2. Los 2 tienen que tener las mismas teclas
        //Tb creo que se puede borrar un treeMap

        /*TreeMap<Integer, Integer> tcServidor = new TreeMap<Integer, Integer>();
        tcServidor.put(38, 0);
        tcServidor.put(40, 1);
        tcServidor.put(37, 2);
        tcServidor.put(39, 3);*/

        auto1=new Autito(1, 300,20,20,20,Color.ORANGE,5,true, this,tcServidor);
        this.getFigura().add(auto1);
      //  this.addKeyListener(auto1);

         
        
        /*TreeMap<Integer, Integer> tcCliente = new TreeMap<Integer, Integer>();
        tcCliente.put(87, 0);
        tcCliente.put(88, 1);
        tcCliente.put(65, 2);
        tcCliente.put(68, 3);*/
        auto2=new Autito(2, 30,560,20,20,Color.blue,5,true, this,tcCliente);

        this.getFigura().add(auto2);
   //     this.addKeyListener(auto2);
        
 
        

        base = new Base(0, 10,260,80,30,Color.MAGENTA,1,true,this);
        this.getFigura().add(base);

        destino = new Destino(0, 760,260,80,30,Color.WHITE,1,true,this);
        this.getFigura().add(destino);

        policia1 = new Policia(1, 320,15,30,30,Color.RED,1000,true, this);
        this.getFigura().add(policia1);
        policia2 = new Policia(2, 370,15,30,30,Color.RED,1000,true, this);
        this.getFigura().add(policia2);
        policia3 = new Policia(3, 420,15,30,30,Color.RED,1000,true, this);
        this.getFigura().add(policia3);
        Policia policia4 = new Policia(3, 420,550,30,30,Color.RED,1000,true, this);
        this.getFigura().add(policia4);
        Policia policia5 = new Policia(3, 120,550,30,30,Color.RED,1000,true, this);
        this.getFigura().add(policia5);

      
        semaforo1 = new Semaforo(1, 315,185,90,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo1);
        semaforo2 = new Semaforo(2, 445,185,90,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo2);
        semaforo3 = new Semaforo(1, 315,320,100,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo3);
        semaforo4 = new Semaforo(2, 445,320,100,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo4);
        semaforo5 = new Semaforo(1, 145,320,100,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo5);
        semaforo6 = new Semaforo(2, 615,320,100,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo6);
        semaforo7 = new Semaforo(1,145,10,100,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo7);
        semaforo8 = new Semaforo(2, 615,500,100,5,Color.gray,1,true,this.getFigura());
        this.getFigura().add(semaforo8);
        
       
        jlabel1 = new JLabel();
        jlabel1.setBounds(850, 50, 200, 200);
        
        jlabel2 = new JLabel();
        jlabel2.setBounds(850, 90, 200, 200);
        
        jframe.getContentPane().add(jlabel1);
        jframe.getContentPane().add(jlabel2);

        pantalla = new Pantalla(this);
        pantalla.start();

        this.updateMarcador();

        perito = new PeritoColision(this.getFigura());

        arbitro = new Arbitro(this);
        

        
    }

    public void ejecutar() {

        System.out.println(getMensaje());
        this.repaint();
        jframe.setVisible(true);
    }
    
    
 

    public void refrescar() {

        this.repaint();
    
 //creo q hace falta para mandarlo por socket
//        jframe.setVisible(false);
    }

    public Vector<Figuras> getFigura() {

        return figura;
    }

    public void setFigura(Vector<Figuras> fig) {

        this.figura = fig;
    }

    public void setMensaje(String msj) {

        this.mensaje = msj;
    }

    public String getMensaje() {

        return mensaje;
    }

    
    @Override
    public void update(Graphics g) {

        paint(g);
    }

    
    
    public void updateMarcador() {
    
         String a1=new String ("Descargado");
         String a2=new String ("Descargado");

        while(auto1.carga){
            a1="Cargado";
        break;
        }
           while(auto2.carga){
            a2="Cargado";
        break;
        }


        jlabel1.setText("Auto 1  "  +"  vida: " + auto1.vida +"  carga: " + a1);
        jlabel2.setText("Auto 2  "+"  vida: " + auto2.vida +"  carga: " +  a2);
        
        
        
    }
    
    
    
    
    @Override
    public void paint(Graphics g) {

        Class tiposParam[] = {Graphics.class};
        if (grafBuff == null) {

            imgBuff = createImage(jframe.getWidth(), jframe.getHeight());
            grafBuff = imgBuff.getGraphics();

        }
        for (i = (this.getFigura().size()) - 1; i >= 0; i--) {

            try {
                getClass().getMethod("estado" + Boolean.valueOf(getFigura().get(i).vida.equals(0)).
                        toString(), tiposParam).invoke(this, grafBuff);

            } catch (Exception e) {
            }
        }
        g.drawImage(imgBuff, 0, 0, this);
        this.grafBuff.clearRect(0, 0, jframe.getWidth(), jframe.getHeight());
    }

    public void estadotrue(Graphics g) {
    }

    public void estadofalse(Graphics g) {

        getFigura().get(i).dibujar(g);
    }


    
    
    
   
    public void windowClosing(WindowEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
       int exit = JOptionPane.showConfirmDialog(this, "Desea salir ?");
            if (exit == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
       
    }

    public void windowClosed(WindowEvent e) {
        //  throw new UnsupportedOperationException("Not supported yet.");
        System.exit(0);
    }

    
    public void windowIconified(WindowEvent e) {
        //  throw new UnsupportedOperationException("Not supported yet.");
    }

    public void windowDeiconified(WindowEvent e) {
        //    throw new UnsupportedOperationException("Not supported yet.");
    }

    public void windowActivated(WindowEvent e) {
        //  throw new UnsupportedOperationException("Not supported yet.");
    }

    public void windowDeactivated(WindowEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
    }

    public void windowOpened(WindowEvent e) {
        try{
            throw new UnsupportedOperationException("Not supported yet.");
        }catch(Exception ex) {}
    }

}
